FPGA AMIに入ってるvivadoのシミュレータをリモートからVNC経由で使ってみる
はじめに
AWS EC2 F1インスタンスで使えるようになったFPGAですが、その中身の開発にはシミュレータの利用が必須です。本格的に開発ツールを使うにはGUIから使う必要があります。今回は、FPGA AMIから起動したAWSインスタンスにVNCサーバをセットアップし、sshのポートフォワード経由で、手元のMac OSXから利用して、vivadoのシミュレータを動かしてみました。
インスタンスを起動
まずはEC2インスタンスを起動します。これまではN.Virginia(us-east-1)リージョンを使っていましたが、FPGA AMIで開発ツールを動かすだけであれば、Tokyo(ap-northeast-1)リージョンでも利用可能なようです。GUIをリモートから使う場合には、少しでもRTT(Round Trip Time)が小さいほうが快適ですので、今回はこちらで試してみました。
AWSコンソールにログイン、EC2の画面を開き、Tokyoリージョンを選んでLaunch Instanceボタンを押します。AMIとしてAMI Marketplaceから"FPGA Developer AMI"を選択、インスタンスタイプには今回は少し小さめのt2.largeを選んでみました。あとはデフォルトのままでOKです。
インスタンスが起動するまでしばらく待ちます。起動を確認したらConnectボタンを押し、ホスト名等を確認。SSHキーファイルを指定してSSHで接続します。FPGA AMI(中身はcentos)のユーザ名はrootではなくcentosですのでご注意ください。
VNCのセットアップと接続
FPGA AMIのホームディレクトリに置いてあるGUI_README.mdには、リモートからGUIを使用するために、いくつかの選択肢が記載されています。
- X11 Forwarding over SSH
- X2Go, Open NX
- VNC
- XRDP + VNC
XRDS(Windows Remote Desktop)については、詳しい手順の記載があるのですが、カーネルの再ビルドが必要云々と書いてあり面倒です。手っ取り早いのがX11を使う方法ですが、試してみたところ遅くて使いものになりませんでした。
そのため今回はVNCを試してみることにします。ところが、FPGA AMIには、VNCサーバやX-Window関連が入っておりませんので、まずはこれらのインストールから始めます。
インスタンスにSSHで接続したら、yumで必要なパッケージを入れていきます。VNCサーバとしてtigervncを使います。必要なパッケージが依存関係で自動インストールしてくれなかったため、個別に下記をインストールする必要がありました。それから、VNCサーバのデフォルト設定ではウインドウマネージャがtwmなのですが、すでにCentOS 7では削除されてしまっており、yumでインストールすることができませんでした。そのため、CentOS 6のパッケージをダウンロードして、rpmで直接インストールしました。OSのバージョンが違いますが、正常にインスールでき正常動作しました。
$ sudo yum install -y tigervnc-server.x86_64 $ sudo yum install -y libXext.x86_64 libXrender.x86_64 libXtst.x86_64 xorg-x11-xauth $ sudo yum install -y xterm.x86_64 $ wget http://mirror.centos.org/centos/6/os/x86_64/Packages/xorg-x11-twm-1.0.3-5.1.el6.x86_64.rpm $ sudo rpm -ivh xorg-x11-twm-1.0.3-5.1.el6.x86_64.rpm
インストールできたら、VNCサーバを起動します。パスワード設定が要求されますので入力します(2回)。デフォルトではスクリーンサイズが小さいので、少し大きめを指定しています。
$ vncserver -geometry 1440x900 You will require a password to access your desktops. Password: {enter new password} Verify: {type again} xauth: file /home/centos/.Xauthority does not exist New 'ip-172-31-XX-XX:1 (centos)' desktop is ip-172-31-XX-XX:1 Creating default startup script /home/centos/.vnc/xstartup Starting applications specified in /home/centos/.vnc/xstartup Log file is /home/centos/.vnc/ip-172-31-XX-XX:1.log
この状態でバックグラウンドでディスプレイ番号1のVNCサーバが起動しました。このVNCサーバへはTCPポート5901で接続が可能です。直接接続することも可能ですが、セキュリティの点からもSSHポートフォワーディングを使うことにします。(ポートフォワードを使わず直接VNCで開くには、セキュリティグループの設定が必要です)
ポートフォワードの指定として -L 5901:127.0.0.1:5901 をSSHコマンドのオプションに追加するために、一度インスタンスからログアウトして再接続します。
$ ssh -i your-key.pem [email protected] -L 5901:127.0.0.1:5901
ログインしたら接続したままにしておきます。この状態でローカルの127.0.0.1:5901
への接続が、リモートの5901への接続として転送される状態となります。
この状態で適当なVNCクライアントで接続します。ここではMac OSXにデフォルトで入っているVNC機能を使います。ファインダのメニューから、Go > Connect To Server... を選びます(またはコマンドKを押す)。接続先を聞かれるので、"vnc://127.0.0.1:5901/"を入力します。
ポートフォワードがうまくいっていれば、パスワードを聞かれるので、さきほどのパスワードを入力します。そうすると、VNCのスクリーンが現れます。ウインドウマネージャがTWMなので見かけが素っ気ないです。
Vivadoを起動する
ようやく用意が整ったので、開発ツールであるvivadoを起動します。VNCのスクリーンにあるxtermから、vivadoと入力して起動します。起動にしばらく(2分くらい)時間がかかりますが、成功するとこのようにプロジェクト選択画面が現れます。
簡単なサンプルプロジェクトとして、FPGA AMIのホームディレクトリに用意されているsrc/test/counter
を開いてみます。以前ビルドを試したものと同じです。前回はコマンドラインでビルドしましたが、今回はGUIツールで開きます。Open Projectをクリックして、src/test/counter
のディレクトリを開き、counter.xpr
プロジェクトファイルを選択して開きます。
ところが、開発ツールのバージョンが違うというウォーニングが出ます。使っているのは2017.1最新バージョンですが、FPGA AMIに含まれていたテスト用プロジェクトは2016.4版で制作されたもののようです。そのためか「プロジェクトをアップデート」「リードオンリーで開く」の選択を要求されます。ここではアップデートすることにします。
とりあえずプロジェクトを開くことができたようです。が、しかし必要なHDL(Hardware Description Language)ファイルが見えていないようです。バージョン違いのせいか、ディレクトリ構成が期待しているものと違うのかもしれません。
左側にある「Add Source」をクリックして、Sourceディレクトリにある、counter.v
と tb.v
ファイルを追加します。追加したら、中身を見ることができます。
counter.v
は、8ビットカウンタの実装で、tb.v
は、カウンタを動かすためのテストベンチ(Test Bench)です。
テストベンチがあるので、そのままシミュレーションを実行することができます。左側にある「Run Simulation」をクリックします。そうするとtb.v
に記述されたシミュレーションが行われます。
結果は右側に波形のウィンドウとして表示されます。波形の表示位置を先頭にずらし、また時間スケールを縮小してみると、意味のある波形が出てきます。リセット、そしてクロックでカウントアップしている様子がわかります。
まとめ
FPGA AMIを使って、簡単なサンプルのシミュレーションを試してみました。バージョンの不一致などトラップもあり、またVNC環境の構築が少し手探りでしたが、無事にツールが使えることを確認することができました。また、FPGA AMIがTokyoリージョンでも使えることがわかりました。地理的に近いので快適です。ぜひお試しください。
今回基本的なところが確認できました。他にもSDAccelやOpenCLなどツールやSDKがいろいろありますので、引き続き試してみたいと思います。
注意:FPGA AMIでGUIを利用することはサポートしないとGUI_README.mdに明記されています。了解のうえご利用ください。